package EjerciciosEnClase.EjercicioJuego;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * El Analizador de Juegos solamente expone métodos que permiten buscar
 * Participantes en los Juegos dados.
 */
public class AnalizadorDeJuegos {

	/**
	* @post: Devuelve el conjunto de Participante que participaron en ambos
	*		 Juegos (juego1 y juego2).
	*/
	public Set<Participante> buscarParticipantesRepetidos(Juego juego1, Juego juego2){
		Set<Participante> grupoTotalDeParticipantes = new HashSet<Participante>();
		Iterator<Participante> itParticipanteJuego1 = juego1.getParticipante().iterator();
		Iterator<Participante> itParticipanteJuego2 = juego2.getParticipante().iterator();
		while(itParticipanteJuego1.hasNext()){
			Participante proximoParticipante = itParticipanteJuego1.next();
			if(juego2.getParticipante().contains(proximoParticipante)){
				grupoTotalDeParticipantes.add(proximoParticipante);
			}
		}
		while(itParticipanteJuego2.hasNext()){
			Participante proximoParticipante = itParticipanteJuego2.next();
			if(juego1.getParticipante().contains(proximoParticipante)){
				grupoTotalDeParticipantes.add(proximoParticipante);
			}
		}
		return grupoTotalDeParticipantes;
	}

	/**
	* @post: Devuelve el conjunto de Participante que participaron en TODOS los
	*		 Juegos
	*/
	public Set<Participante> buscarParticipantesRepetidos(List<Juego> juegos){
		Set<Participante> grupoTotalDeParticipantes = new HashSet<Participante>();
		Iterator<Juego> itJuegos = juegos.iterator();
		List<Participante> participantesEnTodosLosJuegos = new LinkedList<Participante>();
		if(itJuegos.hasNext()){
			participantesEnTodosLosJuegos = itJuegos.next().getParticipante();
		}
		while(itJuegos.hasNext()){
			participantesEnTodosLosJuegos = this.generarListaConParticipantesEnComun(itJuegos.next().getParticipante(), participantesEnTodosLosJuegos);
		}
		grupoTotalDeParticipantes.addAll(participantesEnTodosLosJuegos);
		return grupoTotalDeParticipantes;
	}
	
	/**
	* @post: Devuelve el conjunto de Participantes que participaron en un
	*		 unico Juego.
	*/
	public Set<Participante> buscarParticipantesUnitarios(List<Juego> juegos){
		Set<Participante> grupoDeParticipantes = new HashSet<Participante>();
		Iterator<Juego> itJuegos = juegos.iterator();
		List<Participante> participantesEnUnUnicoJuego = new LinkedList<Participante>();
		while(itJuegos.hasNext()){
			participantesEnUnUnicoJuego = this.generarListaConParticipantesEnUnUnicoJuego(participantesEnUnUnicoJuego, itJuegos.next().getParticipante());
		}
		grupoDeParticipantes.addAll(participantesEnUnUnicoJuego);
		return grupoDeParticipantes;
	}
	
	/**
	 * @post: Devuelve una lista con los Participantes que no se repiten en ambas listas.
	 */
	private List<Participante> generarListaConParticipantesEnUnUnicoJuego(
			List<Participante> participantesEnUnUnicoJuego,
			List<Participante> listaParticipantes) {
		
		List<Participante> participantes = new LinkedList<Participante>();
		Iterator<Participante> itParticipante = participantesEnUnUnicoJuego.iterator();
		while (itParticipante.hasNext()) {
			Participante proximoParticipante = itParticipante.next();
			if(!listaParticipantes.contains(proximoParticipante)){
				participantes.add(proximoParticipante);
			}
		}
		return participantes;
	}

	/**
	 * @post: Devuelve una lista con los Participantes en comun.
	 */
	private List<Participante> generarListaConParticipantesEnComun(
			List<Participante> listaParticipantes,
			List<Participante> participantesEnTodosLosJuegos) {
		List<Participante> participantesEnComun = new LinkedList<Participante>();
		Iterator<Participante> itParticipante = listaParticipantes.iterator();
		while (itParticipante.hasNext()) {
			Participante proximoParticipante = itParticipante.next();
			if(participantesEnTodosLosJuegos.contains(proximoParticipante)){
				participantesEnComun.add(proximoParticipante);
			}
		}
		return participantesEnComun;
	}
	
}
